'''
数据清洗和数据库插入模块
@author LongTao 2023.06.01
'''

import mysql.connector
import pymysql.converters as pc # 使用escape_string进行字段转义避免数据库报错
import os
import datetime

def getTdate(): # 自动生成填报周期
    """
    在每个季度第二天的时候执行任务，自动生成填报周期tdate字段以写入数据库
    生成规则：当月-1，example: NOW 2023-7-2，tdate = 2023-06
    :return: tdate 填报周期 YYYY-03/06/09/12 when month = 04/07/10/01
    """
    today = datetime.date.today()
    quarter = today + datetime.timedelta(days=-today.day)
    tdate = datetime.datetime.strftime(quarter, "%Y-%m")  # out: YYYY-MM
    # print(tdate)
    return tdate

def getTime():
    now = datetime.datetime.now()
    format_time = now.strftime("%Y-%m-%d %H:%M:%S") # 写入数据库的最后修改时间
    return format_time

# 返回最新的文件文件名
# linux下文件路径 path="/opt/rsdata/file/"
def operate():
    tdate = getTdate()
    time = getTime()
    path = "/opt/rsdata/file/"
    lists = os.listdir(path)
    lists.sort(key=lambda x: os.path.getmtime((path + x)))
    newest = os.path.join(lists[-1]) # 获取最新文件名
    with open(f'/opt/rsdata/project/log.txt','a',encoding='utf-8') as F:
        F.write('准备写入数据库，文件名' + newest + '\n')

    # 创建数据库链接和操作游标
    conn = mysql.connector.connect(host='localhost', user='rsdata', password='rsdata@96956', port=3306,
                                   database='ry_resource')
    cursor = conn.cursor()

    print('数据库已链接')

    with open(f'/opt/rsdata/file/{newest}', 'r', encoding='utf-8') as f:

        for line in f.readlines():
                data = line.strip().split(',')
                city1, county1, field, value = data[1].replace('市', '分公司'), pc.escape_string(data[2]), \
                    pc.escape_string(data[3]).replace('(不含网关)', '').replace("+", "").replace("OTT盒子","机顶盒4KIP"), data[4]
                city = city1.replace('广州分公司','广东有线')

                county = county1.replace('惠州龙门','龙门').replace('梅州五华','五华').replace('梅州平远','平远').replace('梅州大埔','大埔')\
                .replace('梅州蕉岭','蕉岭').replace('梅州分公司融合区','梅州融合区').replace('梅州分公司坭陂','梅州坭陂')\
                .replace('汕尾海丰','海丰').replace('汕尾陆丰','陆丰').replace('汕尾陆河','陆河').replace('汕尾城区','城区')\
                .replace('珠海斗门','斗门').replace('珠海金湾','金湾').replace('湛江东海','东海').replace('湛江廉江','廉江')\
                .replace('肇庆高新区','高新区')
                '''
                替换XX市为XX分公司，去掉字段中不需要的字符,替换广州分公司为广东有线，替换OTT盒子为机顶盒4KIP以匹配数据库
                line: 20230331,潮州市,潮州分公司,高清双向机顶盒到达数（不含网关）,111222
                city:潮州分公司 county：潮州分公司 field:高清双向机顶盒到达数 value:111222
                '''

                cursor.execute("SHOW COLUMNS FROM tb_tmp LIKE '{}' ".format(field))
                # 去掉表中没有的字段,tb_tmp 来源于复制表 tb_rs_zdywqktjb2_1, 只保留结构, 预先创建

                if not cursor.fetchone():
                    pass
                else: # 开始插入需要的字段数据
                    cursor.execute("SELECT id FROM tb_tmp WHERE 县分公司=%s", (county,))
                    result = cursor.fetchone()
                    if not result: # 县分是否已存在，存在则UPDATE，不存在则INSERT
                        cursor.execute("INSERT INTO tb_tmp (市分公司,县分公司,`{}`) VALUES (%s,%s,%s)".format(field),
                                       (city, county, value))
                    else:
                        id = result[0]
                        cursor.execute("UPDATE tb_tmp SET `{}` = %s WHERE id=%s".format(field), (value, id))
                sql_tdate = "update tb_tmp set tdate='{}'" .format(tdate) # 录入填报周期
                sql_editor = "update tb_tmp set 最后修改人='大数据取数'" # 标记为取数
                sql_time = "update tb_tmp set 最后修改时间='{}'" .format(time) # 取数时间

                cursor.execute(sql_tdate)
                cursor.execute(sql_editor)
                cursor.execute(sql_time)

    conn.commit()

    sql_tmp2tab ="insert into tb_rs_zdywqktjb2_1 (市分公司,县分公司,tdate,标清机顶盒到达数,高清双向机顶盒到达数,高清单向机顶盒到达数,CM网关到达数,网口网关到达数,光口网关到达数,EOC网关到达数,机顶盒4KIP到达数,在用标清机顶盒到达数,在用高清双向机顶盒到达数,在用高清单向机顶盒到达数,在用CM网关到达数,在用网口网关到达数,在用光口网关到达数,在用EOC网关到达数,在用4KIP盒子到达数,最后修改人,最后修改时间)" \
                "select 市分公司,县分公司,tdate,标清机顶盒到达数,高清双向机顶盒到达数,高清单向机顶盒到达数,CM网关到达数,网口网关到达数,光口网关到达数,EOC网关到达数,机顶盒4KIP到达数,在用标清机顶盒到达数,在用高清双向机顶盒到达数,在用高清单向机顶盒到达数,在用CM网关到达数,在用网口网关到达数,在用光口网关到达数,在用EOC网关到达数,在用4KIP盒子到达数,最后修改人,最后修改时间 " \
                "from tb_tmp"
    sql_truncate ="truncate tb_tmp"

    cursor.execute(sql_tmp2tab) # 从临时表插入到正式表
    conn.commit()

    cursor.execute(sql_truncate) # 清空临时表
    conn.commit()

    cursor.close()
    conn.close()

    with open('/opt/rsdata/project/log.txt', "a", encoding='utf-8') as f: # 简易log
        timenow = str(datetime.datetime.now())
        f.write(timenow + '\t' + tdate +'填报周期数据已录入数据库, ' + '数据文件名：' + newest + '\n')

def run():
    try:
        operate()
        print('写入任务已完成')
    except:
        print('INSERT MySQL error')
